/**
 * 多项式类，继承来自链表
 * 
 * @author 杨满球（本地）
 *
 */
class Polynomial extends LinkList {

	/**
	 * 移除无意义的项（系数为零）
	 */
	public void removeEmptyTerm() {
		Node p = this.getHead();
		while (p.hasNext()) {
			p = p.getNextNode();
			Term t = (Term) p.getData();
			if (t.getCoef() == 0) {
				int index = this.indexOf(t);
				try {
					this.removeNode(index);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 合并同类项
	 */
	public void mergeSimilarTerms() {
		Node base = this.getHead();
		Node sample;
		Term baseT, sampleT;
		// 循环查看多项式中的每一项
		while (base.hasNext()) {
			// 取得一个项作为基准
			base = base.getNextNode();
			baseT = (Term) base.getData();
			sample = base;
			// 循环查看基准项后的其他项
			while (sample.hasNext()) {
				// 取得一个样本项
				sample = sample.getNextNode();
				sampleT = (Term) sample.getData();
				if (baseT.isSimilarTerms(sampleT)) {// 如果样本项与基准项是同类项
					// 将样本项合并到基准项
					baseT.changeCoef(sampleT.getCoef());
					try {
						// 移除该样本项
						this.removeNode(this.indexOf(sample.getData()));
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
		// 移除无意义项
		this.removeEmptyTerm();
	}

	/**
	 * 与一个多项式相加
	 * 
	 * @param p
	 *            需要相加的多项式
	 */
	public void addPolynomial(Polynomial p) {
		// 将多项式连接为一个多项式
		this.appendLinkList(p);
		// 合并同类项
		this.mergeSimilarTerms();
	}

	/**
	 * 获得多项式的字符串表现形式
	 * 
	 * @return 多项式的字符串表示
	 */
	public String getString() {
		// 多项式为空
		if (this.length() < 1) {
			return "This link list is Empty.";
		}
		Node p = this.getHead().getNextNode();
		String pString = p.getData().toString();
		// 循环添加项
		while (p.hasNext()) {
			p = p.getNextNode();
			Term t = (Term) p.getData();
			if (t.getCoef() >= 0) {// 系数大于零，用加号连接
				pString = pString + "+" + t.toString();
			} else {// 小于零用负号（系数自带）连接
				pString = pString + t.toString();
			}
		}
		return pString;
	}
}
